#include"pipe.hpp"
#include"chh.hpp"
// typedef std::function<void()> pipe_wk;

// // 父进程管理管道
// class pipe_test
// {
// public:
//     pipe_test(int wfd, pid_t pid) : _wfd(wfd), _pid(pid)
//     {
//         _name += "管道：描述符" + std::to_string(_wfd) + "目标进程pid:" + std::to_string(_pid);
//     }
//     // 向管道写
//     void sand(int cmd)
//     {
//         ::write(_wfd, &cmd, sizeof(cmd));
//     }
//     std::string Name()
//     {
//         return _name;
//     }

//     // 关闭写端
//     void Close()
//     {
//         ::close(_wfd);
//     }

//     // 返回子进程id
//     pid_t Id()
//     {
//         return _pid;
//     }

// private:
//     int _wfd;          // 标识管道写端
//     pid_t _pid;        // 子进程的pid-区分每一个子进程
//     std::string _name; // 管道全称
// };
// // 子进程执行的任务
// void work_t()
// {
//     while (true)
//     {
//         int cmd = 0;
//         int n = ::read(0, &cmd, sizeof(cmd));

//         if (n == sizeof(cmd))
//         {
//             // 执行任务方法
//             tm.exe(cmd);
//         }
//         else if (n == 0) // 读到0说明写端关闭了
//         {
//             std::cout << "写端关闭，pid:" << getpid() << "已退出" << std::endl;
//             break;
//         }
//         else
//         {
//         }
//     }
// }
// void pipe_d(int num, std::vector<pipe_test> &ve_pipe, pipe_wk wk)
// {

//     for (int i = 0; i < num; i++)
//     {
//         int fds[2];
//         int n = pipe(fds);
//         pid_t id = fork();
//         if (id == 0)
//         {
//             ::close(fds[1]);
//             dup2(fds[0], 0);
//             work_t();
//             exit(1);
//         }
//         // 父进程
//         ::close(fds[0]);

//         // 将目标进程初始化
//         ve_pipe.emplace_back(fds[1], id);
//     }
// }

// // 父进程派发任务
// void pf(std::vector<pipe_test> ve_pipe)
// {
//     int curr = 0;
//     int num = 20; // 20个任务
//     while (num--)
//     {
//         // 选择一个任务整数
//         int task = tm.task();
//         // 选择一个子进程
//         pipe_test &cur = ve_pipe[curr++];
//         // who%=size就会回到0
//         curr %= ve_pipe.size();

//         std::cout << "###############" << std::endl;
//         std::cout << "sand " << task << "to" << cur.Name() << ",任务还剩下:" << num << std::endl;
//         std::cout << "###############" << std::endl;

//         // 向管道写，派发给子进程
//         cur.sand(task);
//         sleep(3);
//     }
// }
// // 3.退出进程池
// void cleanproce(std::vector<pipe_test> &channels)
// {
//     for (auto &i : channels)
//     {
//         // 把所有子进程关闭
//         i.Close();
//     }
//     // 回收子进程
//     for (auto &i : channels)
//     {
//         pid_t rid = ::waitpid(i.Id(), nullptr, 0);
//         if (rid > 0)
//         {
//             std::cout << "rid:" << rid << "已回收" << std::endl;
//         }
//     }
// }
// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         std::cout << argv[0] << "使用方法：可执行程序+子进程个数" << std::endl;
//         exit(1);
//     }

//     int num = std::stoi(argv[1]);
//     // 创建子进程，初始化类
//     std::vector<pipe_test> ve_pipe;
//     pipe_d(num, ve_pipe, work_t);

//     // 派发任务
//     pf(ve_pipe);

//     // 3.退出进程池
//     cleanproce(ve_pipe);
//     return 0;
// }



int main(int argc,char* argv[])
{
    if(argc != 2)
    {
        std::cout << "使用方法:" << argv[0] << "+ 子进程个数" << std::endl;
        exit(0);
    }
    int n = std::stoi(argv[1]);

    chh* h = new chh(n,test_wrk);
    h->add();
    h->printf_name();

    h->atch();
    
    return 0;
}